#include "key_manage.h"
#include "stm32f4xx_hal.h"
#include "spi_comm.h"

#define KEY_SIZE 32          // AES-256密钥长度（32字节）
#define FLASH_KEY_ADDR 0x08070000 // 片内Flash密钥存储地址（最后1页）
uint8_t g_current_key[KEY_SIZE] = {0}; // 当前密钥缓存

// 读取Flash中存储的密钥
void Key_Read_From_Flash(void) {
  memcpy(g_current_key, (uint8_t*)FLASH_KEY_ADDR, KEY_SIZE);
}

// 向FPGA2发送新密钥（并销毁旧密钥）
HAL_StatusTypeDef Key_Update_To_FPGA2(uint8_t *new_key) {
  uint8_t cmd = 0x01; // 密钥更新命令
  HAL_StatusTypeDef status;

  // 1. 发送“密钥更新”命令
  status = SPI_Send_Data(&cmd, 1, 100);
  if (status != HAL_OK) return status;

  // 2. 发送新密钥（32字节）
  status = SPI_Send_Data(new_key, KEY_SIZE, 500);
  if (status != HAL_OK) return status;

  // 3. 等待FPGA2确认（1字节：0xAA表示成功）
  uint8_t ack = 0;
  status = SPI_Receive_Data(&ack, 1, 500);
  if (status != HAL_OK || ack != 0xAA) return HAL_ERROR;

  // 4. 销毁旧密钥（Flash擦除+写入0）
  FLASH_EraseInitTypeDef erase_init;
  uint32_t page_error = 0;
  erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
  erase_init.Sector = FLASH_SECTOR_11; // 对应0x08070000所在扇区
  erase_init.NbSectors = 1;
  erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_3;
  HAL_FLASH_Unlock();
  HAL_FLASHEx_Erase(&erase_init, &page_error);
  // 写入新密钥到Flash
  for (int i=0; i<KEY_SIZE; i++) {
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, FLASH_KEY_ADDR+i, new_key[i]);
  }
  HAL_FLASH_Lock();

  // 5. 更新本地缓存
  memcpy(g_current_key, new_key, KEY_SIZE);
  return HAL_OK;
}